package com.guaoran.interview.in2018.thread.queue;

import jdk.nashorn.internal.ir.IdentNode;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * @Author gucheng
 * @Description ArrayBlockingQueue
 *  阻塞队列，
 * 2019-04-09 10:59
 */
public class ArrayBlockingQueueDemo{
    // 维护了一个重入锁，并获得了两个Condition，默认是非公平的
    static BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<Integer>(10);
    volatile static int count = 0;
    public static void main(String[] args) {
        for (int i = 0; i < 15; i++) {
            final int j = i;
            new Thread(()->{
                blockingQueue.add(count);
                /**
                 * put 和 take
                 * 如果已满添加时阻塞，如果队列为空时取出元素会阻塞
                 * 如果添加成功时会释放队列为空导致的阻塞
                 * 如果取出成功时会释放队列已满导致的阻塞
                 */

                /**
                 * add 和 poll 如果队列已满添加会异常，如果队列为空取出时为null
                 */

//                blockingQueue.take();
//                blockingQueue.poll();
//                blockingQueue.put();
//                blockingQueue.
                System.out.println("add:"+count);
                count++;
            }).start();
        }
        for (int i = 0; i < 15; i++) {
            new Thread(()->{
                    System.err.println("poll:"+blockingQueue.poll());
            }).start();
        }
    }
}
